package com.naiterui.ehp.bs.recommend.service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.naiterui.common.repository.page.PageParamVO;
import com.naiterui.common.repository.page.PageVO;
import com.naiterui.ehp.bp.bo.recommend.DrBaseBusinessDataBO;
import com.naiterui.ehp.bp.bo.recommend.DrPointPrescriptionBO;
import com.naiterui.ehp.bp.bo.recommend.MedicationRecomBO;
import com.naiterui.ehp.bp.bo.recommend.MedicationRecomPaBO;
import com.naiterui.ehp.bp.bo.recommend.PrescriptionPlatformRecomInfoBO;
import com.naiterui.ehp.bp.bo.recommend.RecomOrderInfoBO;
import com.naiterui.ehp.bp.bo.recommend.RecomPrescriptionBO;
import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.recommend.vo.MedicationPrescriptionVO;
import com.naiterui.ehp.bs.recommend.vo.RecomDetailVO;
import com.naiterui.ehp.bs.recommend.vo.RecomLiteVO;
import com.naiterui.ehp.bs.recommend.vo.RecomRecordVO;
import com.naiterui.ehp.bs.recommend.vo.require.DrRequireListVO;

/**
 * 推荐用药相关
 *
 * @version 2017年7月27日 by wangchuan
 * @Description
 */
public interface IRecomService {


    /**
     * 根据医生ID以及其实结束时间获取医生推荐数量 IRecomService.getDrNumByDr()
     *
     * @param doctorId
     * @param start
     * @param end
     * @param status   推荐用药是否购药，0：未购，1：已购
     * @return
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    Integer getDrNumByDr(Long doctorId, Date start, Date end, Integer status);

    /**
     * 获取推荐VO IRecomService.getRecomVO()
     *
     * @param recomId
     * @return
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    MedicationRecomBO getRecomVO(Long recomId);

    /**
     * 获取指定日期范围类的推荐 IRecomService.getSpecifydayRecom()
     *
     * @param recomStatus
     * @param start
     * @param end
     * @return
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    List<MedicationRecomBO> getSpecifydayRecom(List<Integer> recomStatus, Date start, Date end);

    /**
     * 根据推荐ID集合查询对应医生id集合 IRecomService.getRecomDoctorInviter()
     *
     * @param recomIds
     * @return
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    Set<Long> getRecomDoctorInviter(Set<Long> recomIds);

    /**
     * 获取推荐记录VO IRecomService.getMedicationRecomByIds()
     *
     * @param ids
     * @return
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    List<MedicationRecomBO> getMedicationRecomByIds(Set<Long> ids);

    /**
     * 根据会话ID获取推荐记录VO
     *
     * @param consultSessionIds
     * @return
     */
    List<MedicationRecomBO> getMedicationRecomByConsultSessionIds(Set<Long> consultSessionIds);

    /**
     * 患者APP-获取医生推荐列表 IRecomService.getRecomDrugList()
     *
     * @param patientId
     * @param doctorId
     * @param consultId
     * @param page
     * @param num
     * @return
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    PageVO<MedicationRecomPaBO> getRecomDrugList(Long patientId, Long doctorId, Long consultId, int page, int num);

    /**
     * 反写患者姓名
     *
     * @param doctorId    医生id
     * @param patientId   患者id
     * @param patientName 处方笺中患者姓名
     * @Description
     * @author wangchuan
     * @Date 2017年8月4日
     * @since V2.9.0
     */
    boolean saveRemarkName(Long doctorId, Long patientId, String patientName, Integer gender, Integer age, String ageUnit) throws BusinessException;

    /**
     * 推荐成单同步状态，并发购买或取消通知，代替
     *
     * @param orderInfoBO
     * @throws BusinessException
     * @Author gongbaoqiang
     * @Date 2018年10月19日
     * @since 3.4.0
     */
    void updateOrderRecom(RecomOrderInfoBO orderInfoBO) throws BusinessException;

    /**
     * 获取推荐处方信息 IRecomService.getPrescriptionList()
     *
     * @param orderId
     * @param doctorId
     * @param recomIds
     * @return
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    List<DrPointPrescriptionBO> getPrescriptionList(Long orderId, Long doctorId, String recomIds);

    /**
     * 推荐处方CRM审核确认 IRecomService.saveCrmRecomConfirm()
     *
     * @param recomId        推荐单ID
     * @param pharmacistName 药师姓名
     * @param time           审核时间
     * @param status         审核结果-2:审核成功，3:审核失败
     * @param desc           审核结果描述
     * @throws BusinessException
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    void saveCrmRecomConfirm(Long recomId, Long pharmacistId, String pharmacistName, Long time, Integer status, String desc) throws BusinessException;

    /**
     * 获取用药记录列表 IRecomService.getRecomSearchPage()
     *
     * @param doctorId
     * @param key         患者关键字
     * @param pageVO
     * @param showPartBuy 是否显示少购状态
     * @return
     * @throws BusinessException
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    PageVO<RecomLiteVO> getRecomSearchPage(Long doctorId, String key, PageParamVO pageVO, boolean showPartBuy) throws BusinessException;

    /**
     * 获取用药记录详情 IRecomService.getRecomSearchDetail()
     *
     * @param recomId
     * @param doctorId
     * @param showPartBuy 是否显示少购状态
     * @return
     * @throws BusinessException
     * @Author mudou
     * @Date 2017年8月28日
     * @since 2.9.0
     */
    RecomDetailVO getRecomSearchDetail(Long recomId, Long doctorId, boolean showPartBuy) throws BusinessException;

    /**
     * 获取续方详情 IRecomService.getRepeatPrescription()
     *
     * @param doctorId
     * @param recommendId
     * @return
     * @throws BusinessException
     * @Date 2017年12月19日
     * @since 2.14
     */
    MedicationPrescriptionVO getRepeatPrescription(Long doctorId, Long recommendId) throws BusinessException;


    /**
     * 获取医生主动续方处方详情
     * @param doctorId
     * @param recommendId
     * @return
     * @throws BusinessException
     */
    MedicationPrescriptionVO getDrRepeatPrescriptionDetail(Long doctorId, Long recommendId) throws BusinessException;

    /**
     * 删除续方 IRecomService.deleteRecom()
     *
     * @param doctorId
     * @param recommendId
     * @throws BusinessException
     * @Date 2017年12月21日
     * @since 2.14
     */
    void deleteRecom(Long doctorId, Long recommendId) throws BusinessException;

    /**
     * 获取医生备案推药状态 IRecomService.getDoctorRecord()
     *
     * @return
     * @throws BusinessException
     * @Date 2018年3月29日
     * @since 2.16
     */
    RecomRecordVO getDoctorRecord(Long doctorId) throws BusinessException;

    /**
     * 获取处方的审核通过率
     *
     * @param doctorId
     * @return
     */
    public DrBaseBusinessDataBO getDrBaseBusinessData(Long doctorId);

    public PrescriptionPlatformRecomInfoBO getPlatformRecomInfo(Long recomId) throws BusinessException;

    /**
     * 获取患者处方列表
     *
     * @param patientId
     * @param paramVO
     * @return
     */
    PageVO<MedicationRecomPaBO> getPatientRecomList(Long patientId, PageParamVO paramVO, Integer status, Integer type);

    /**
     * 失效处方
     * @param doctorId
     * @param status
     * @param pageVO
     * @return
     */
    PageVO<RecomLiteVO> medicationInvalidList(Long doctorId, Integer status, PageParamVO pageVO) throws BusinessException ;

    Integer getRecommendTypeById(Long recomId);

    /**
     * 处方文件列表
     *
     * @param recomId
     * @param type
     * @return
     */
    List<RecomPrescriptionBO> recomPrescriptionList(List<Long> recomIds);

    /**
     * 批量获取处方状态
     * 
     * @param recomIds
     * @return
     */
    Map<Long, Integer> getRecomStatusMap(Set<Long> recomIds);


    /**
     * 医生端患者续方记录
     * @param doctorId
     * @param inquirerId
     * @param pageVO
     * @return
     */
    PageVO<DrRequireListVO> getRequireRecomSearchPage(Long doctorId, Long inquirerId, PageParamVO pageVO) throws BusinessException;
}
